// test_video_apis.js - 视频查询接口测试脚本
const axios = require('axios');
const fs = require('fs');
const path = require('path');

// API基础URL
const BASE_URL = 'http://localhost:3000/api/videos';

// 测试结果对象
const testResults = {
  totalTests: 0,
  passedTests: 0,
  failedTests: 0,
  testCases: [],
  timestamp: new Date().toISOString()
};

/**
 * 测试用例执行函数
 * @param {string} testName - 测试名称
 * @param {function} testFunction - 测试函数
 */
async function runTest(testName, testFunction) {
  testResults.totalTests++;
  const testCase = { name: testName, status: 'pending', error: null };
  
  try {
    console.log(`开始测试: ${testName}`);
    await testFunction();
    testCase.status = 'passed';
    testResults.passedTests++;
    console.log(`✅ 测试通过: ${testName}`);
  } catch (error) {
    testCase.status = 'failed';
    testCase.error = error.message || String(error);
    testResults.failedTests++;
    console.error(`❌ 测试失败: ${testName}`, error.message || String(error));
  }
  
  testResults.testCases.push(testCase);
}

/**
 * 保存测试结果到文件
 */
function saveResults() {
  const resultsPath = path.join(__dirname, 'video_test_results.json');
  fs.writeFileSync(resultsPath, JSON.stringify(testResults, null, 2));
  console.log(`\n测试结果已保存到: ${resultsPath}`);
  console.log(`总测试数: ${testResults.totalTests}`);
  console.log(`通过测试: ${testResults.passedTests}`);
  console.log(`失败测试: ${testResults.failedTests}`);
}

/**
 * 测试推荐视频接口
 */
async function testRecommendedVideos() {
  const response = await axios.get(`${BASE_URL}/recommended`);
  
  // 验证响应状态
  if (response.status !== 200) {
    throw new Error(`期望状态码200，但得到${response.status}`);
  }
  
  // 验证响应数据格式
  const data = response.data;
  if (data.code !== 200) {
    throw new Error(`期望code为200，但得到${data.code}`);
  }
  
  if (!Array.isArray(data.data.list)) {
    throw new Error('响应数据中list不是数组');
  }
  
  if (typeof data.data.page !== 'number' || typeof data.data.pageSize !== 'number') {
    throw new Error('响应数据缺少分页信息');
  }
  
  console.log(`  获取到 ${data.data.list.length} 个推荐视频`);
}

/**
 * 测试热门视频接口
 */
async function testHotVideos() {
  const response = await axios.get(`${BASE_URL}/hot`);
  
  // 验证响应状态
  if (response.status !== 200) {
    throw new Error(`期望状态码200，但得到${response.status}`);
  }
  
  // 验证响应数据格式
  const data = response.data;
  if (data.code !== 200) {
    throw new Error(`期望code为200，但得到${data.code}`);
  }
  
  if (!Array.isArray(data.data.list)) {
    throw new Error('响应数据中list不是数组');
  }
  
  console.log(`  获取到 ${data.data.list.length} 个热门视频`);
}

/**
 * 测试幻灯片视频接口
 */
async function testSlideVideos() {
  const response = await axios.get(`${BASE_URL}/slide`);
  
  // 验证响应状态
  if (response.status !== 200) {
    throw new Error(`期望状态码200，但得到${response.status}`);
  }
  
  // 验证响应数据格式
  const data = response.data;
  if (data.code !== 200) {
    throw new Error(`期望code为200，但得到${data.code}`);
  }
  
  if (!Array.isArray(data.data)) {
    throw new Error('响应数据不是数组');
  }
  
  // 验证返回数量不超过6个
  if (data.data.length > 6) {
    throw new Error(`期望最多返回6个视频，但得到${data.data.length}个`);
  }
  
  console.log(`  获取到 ${data.data.length} 个幻灯片视频`);
}

/**
 * 测试类别视频接口
 */
async function testVideosByCategory() {
  // 测试存在的类别（使用类别ID 1作为示例）
  const response = await axios.get(`${BASE_URL}/category/1`);
  
  // 验证响应状态
  if (response.status !== 200) {
    throw new Error(`期望状态码200，但得到${response.status}`);
  }
  
  // 验证响应数据格式
  const data = response.data;
  if (data.code !== 200) {
    throw new Error(`期望code为200，但得到${data.code}`);
  }
  
  if (!Array.isArray(data.data.list)) {
    throw new Error('响应数据中list不是数组');
  }
  
  console.log(`  获取到类别1的 ${data.data.list.length} 个视频`);
}

/**
 * 测试类别视频接口 - 无效类别ID
 */
async function testVideosByInvalidCategory() {
  try {
    const response = await axios.get(`${BASE_URL}/category/invalid`);
    throw new Error(`期望返回错误，但得到状态码${response.status}`);
  } catch (error) {
    if (error.response && error.response.status === 400) {
      console.log(`  成功验证无效类别ID的错误处理`);
      return;
    }
    throw error;
  }
}

/**
 * 测试分页参数
 */
async function testPagination() {
  const response = await axios.get(`${BASE_URL}/recommended?page=2&pageSize=5`);
  
  if (response.status !== 200) {
    throw new Error(`期望状态码200，但得到${response.status}`);
  }
  
  const data = response.data;
  if (data.data.page !== 2 || data.data.pageSize !== 5) {
    throw new Error('分页参数未正确返回');
  }
  
  console.log(`  分页测试通过，page=${data.data.page}, pageSize=${data.data.pageSize}`);
}

/**
 * 主测试函数
 */
async function runAllTests() {
  console.log('开始执行视频查询接口测试...\n');
  
  try {
    await runTest('推荐视频接口', testRecommendedVideos);
    await runTest('热门视频接口', testHotVideos);
    await runTest('幻灯片视频接口', testSlideVideos);
    await runTest('类别视频接口', testVideosByCategory);
    await runTest('无效类别ID处理', testVideosByInvalidCategory);
    await runTest('分页功能测试', testPagination);
  } finally {
    saveResults();
  }
}

// 执行测试
runAllTests().catch(error => {
  console.error('测试执行失败:', error);
  saveResults();
  process.exit(1);
});